// 定义包路径，属于驾校模块的web控制器
package com.ruoyi.web.controller.jiaxiao;

// 导入所需的Java工具类，BigDecimal用于高精度数值计算
import java.math.BigDecimal;
import java.util.List;
// 导入Spring相关注解
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
// 导入系统自定义的注解和类
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.JxPayment;
import com.ruoyi.system.service.IJxPaymentService;

// 标识该类为REST风格的控制器
@RestController
// 定义请求路径前缀，所有该控制器的接口都以/jiaxiao/payment开头
@RequestMapping("/jiaxiao/payment")
// 继承基础控制器，获得通用功能
public class JxPaymentController extends BaseController {

    // 自动注入缴费记录服务接口的实现类
    @Autowired
    private IJxPaymentService service;

    // 方法级别权限控制，只有拥有jiaxiao:payment:list权限的用户才能访问
    @PreAuthorize("@ss.hasPermi('jiaxiao:payment:list')")
    // 定义GET请求的接口路径
    @GetMapping("/list")
    // 处理查询缴费记录列表的请求
    public TableDataInfo list(JxPayment query) {
        // 开始分页，从请求参数中获取分页信息
        startPage();
        // 调用服务层方法查询符合条件的缴费记录列表
        List<JxPayment> list = service.selectList(query);
        // 将查询结果转换为表格数据格式并返回
        return getDataTable(list);
    }

    // 方法级别权限控制，只有拥有jiaxiao:payment:query权限的用户才能访问
    @PreAuthorize("@ss.hasPermi('jiaxiao:payment:query')")
    // 定义GET请求的接口路径，{id}为路径参数
    @GetMapping("/{id}")
    // 根据ID查询缴费记录详情
    public AjaxResult getInfo(@PathVariable Long id) {
        // 调用服务层方法查询指定ID的缴费记录，并封装成成功的AjaxResult返回
        return AjaxResult.success(service.selectById(id));
    }

    // 方法级别权限控制，只有拥有jiaxiao:payment:add权限的用户才能访问
    @PreAuthorize("@ss.hasPermi('jiaxiao:payment:add')")
    // 日志注解，记录操作标题和业务类型为新增
    @Log(title = "缴费", businessType = BusinessType.INSERT)
    // 定义POST请求的接口路径
    @PostMapping
    // 新增缴费记录
    public AjaxResult add(@RequestBody JxPayment e) {
        // 调用服务层方法插入数据，并将结果转换为AjaxResult返回
        return toAjax(service.insert(e));
    }

    // 方法级别权限控制，只有拥有jiaxiao:payment:edit权限的用户才能访问
    @PreAuthorize("@ss.hasPermi('jiaxiao:payment:edit')")
    // 日志注解，记录操作标题和业务类型为更新
    @Log(title = "缴费", businessType = BusinessType.UPDATE)
    // 定义PUT请求的接口路径
    @PutMapping
    // 修改缴费记录
    public AjaxResult edit(@RequestBody JxPayment e) {
        // 调用服务层方法更新数据，并将结果转换为AjaxResult返回
        return toAjax(service.update(e));
    }

    // 方法级别权限控制，只有拥有jiaxiao:payment:remove权限的用户才能访问
    @PreAuthorize("@ss.hasPermi('jiaxiao:payment:remove')")
    // 日志注解，记录操作标题和业务类型为删除
    @Log(title = "缴费", businessType = BusinessType.DELETE)
    // 定义DELETE请求的接口路径，{ids}为路径参数，支持批量删除
    @DeleteMapping("/{ids}")
    // 删除缴费记录
    public AjaxResult remove(@PathVariable Long[] ids) {
        // 调用服务层方法批量删除数据，并将结果转换为AjaxResult返回
        return toAjax(service.deleteByIds(ids));
    }

    // 方法级别权限控制，只有拥有jiaxiao:payment:query权限的用户才能访问
    @PreAuthorize("@ss.hasPermi('jiaxiao:payment:query')")
    // 定义GET请求的接口路径，{studentId}为路径参数
    @GetMapping("/sumPaid/{studentId}")
    // 查询指定学员的总缴费金额
    public AjaxResult sumPaid(@PathVariable Long studentId) {
        // 调用服务层方法计算指定学员的总缴费金额
        BigDecimal amt = service.sumPaidByStudent(studentId);
        // 将计算结果封装成成功的AjaxResult返回
        return AjaxResult.success(amt);
    }
}